最简单的层次聚类算法及代码

给定要聚类的N的对象以及N*N的距离矩阵(或者是相似性矩阵), 层次式聚类方法的基本步骤(参看S.C. Johnson in 1967)如下:
1 将每个对象归为一类, 共得到N类, 每类仅包含一个对象. 类与类之间的距离就是它们所包含的对象之间的距离.
2 找到最接近的两个类并合并成一类, 于是总的类数少了一个.
3 重新计算新的类与所有旧类之间的距离.
4 重复第2步和第3步, 直到最后合并成一个类为止(此类包含了N个对象).

database={1,2,3,4,5,9,10,11,12,17,18,19,80,88,90,21}
def distan(x,y):
    # 求两个实体之间的距离,要替换距离算法
    return abs(x-y)

def cludiatan(cluster1,cluster2):
    sum=0
    for i in cluster1:
        for j in cluster2:
            tem=distan(i,j)
            sum+=tem
    average=sum/(len(cluster1)+len(cluster2))
    # print(average)
    return average

l=list()
for m in database:
    n=list()
    n.append(m)
    l.append(n)

while len(l)>4:
    min = 100
    for i in l:
        for j in l:
            if i != j:  #
                similarity = cludiatan(i, j)
                if min > similarity:
                    min = similarity
                    geti = i  # get 最小值 時 的兩個post名稱
                    getj = j
            else:  # 如果相同就直接pass不用看
                pass
    l.remove(geti)
    l.remove(getj)
    clus=list()
    clus.extend(geti)
    clus.extend(getj)
    l.append(clus)
    #print(len(l))


for o in l:
    print(o)







输出:
[9, 10, 11, 12]
[17, 18, 19, 21]
[1, 2, 5, 3, 4]
[80, 88, 90]

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值